package com.design.singleton.lazy;

/**
 * @auther LiZiBa
 * @date 2020/8/7 23:50
 * @description: 这里其实要明白一个原则，锁机制我们尽可能的要去锁住最少的资源，这样才能最大化性能
 **/
public class DoubleCheckLazySingleton {

    // volatile 保持内存可见性，防止指令重排序
    private volatile static DoubleCheckLazySingleton doubleCheckLazySingleton;

    private DoubleCheckLazySingleton() {
    }

    public static DoubleCheckLazySingleton getInstance(){

        // 是否要新建资源
        if(doubleCheckLazySingleton == null) {

            synchronized (DoubleCheckLazySingleton.class){
                // 在此检查是否需要新建资源
                if(doubleCheckLazySingleton == null) {
                    // 这里会出现指令重排问题
                    doubleCheckLazySingleton = new DoubleCheckLazySingleton();
                }
            }
        }
        return doubleCheckLazySingleton;
    }
}
